package kr.co.bettersoftportal.site.management.controller;


import kr.co.bettersoftportal.site.domain.Member;
import kr.co.bettersoftportal.site.domain.UploadFile;
import kr.co.bettersoftportal.site.management.service.BettersoftPortalService;
import kr.co.bettersoftportal.site.management.util.BettersoftPortalCommon;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

/**
 * CheckMileage Controller : 회원 및 가맹점 관리 사이트 기능
 */
public class BettersoftPortalController extends MultiActionController {


    /**
     * 사원 이미지 생성시 가로 / 세로 사이즈
     */
    private int profile_size_x = 240;
    private int profile_size_y = 240;



    // SLF4J Logging
    private Logger logger = LoggerFactory.getLogger(BettersoftPortalController.class);

    //    @Autowired
//    private BettersoftPortalService bettersoftPortalService = null;
    @Autowired
    private LocaleResolver localeResolver = null;

    @Autowired
    private BettersoftPortalService bettersoftPortalService = null;



    /**
     * 언어 설정을 바꾼다.
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView changeLocale(HttpServletRequest request, HttpServletResponse response) {
        String language = request.getParameter("language");
        Locale locale = new Locale(language);
        localeResolver.setLocale(request, response, locale);
        return new ModelAndView("intro");
    }

    /**
     * index 페이지로 이동한다.
     *
     * @param request HttpServletRequest
     * @param response HttpServletReponse
     * @return ModelAndView
     */
    public ModelAndView index(HttpServletRequest request, HttpServletResponse response) {


        logger.info("index");

        return new ModelAndView("index");
//        return new ModelAndView("index");
    }

    /**
     * portalLogin 페이지로 이동한다.
     *
     * @param request HttpServletRequest
     * @param response HttpServletReponse
     * @return ModelAndView
     */
    public ModelAndView portalLogin(HttpServletRequest request, HttpServletResponse response) {


        logger.info("portalLogin");

        return new ModelAndView("portalLogin");
    }


    /**
     * portalIndex 페이지로 이동한다.
     *
     * @param request HttpServletRequest
     * @param response HttpServletReponse
     * @return ModelAndView
     */
    public ModelAndView portalIndex(HttpServletRequest request, HttpServletResponse response) {


        logger.info("portalIndex");

        return new ModelAndView("portalIndex");
    }

    /**
     * passwordConfirm 페이지로 이동한다.
     *
     * @param request HttpServletRequest
     * @param response HttpServletReponse
     * @return ModelAndView
     */
    public ModelAndView passwordConfirm(HttpServletRequest request, HttpServletResponse response) {


        logger.info("passwordConfirm");

        return new ModelAndView("passwordConfirm");
    }


    /**
     * passwordChange 페이지로 이동한다.
     *
     * @param request HttpServletRequest
     * @param response HttpServletReponse
     * @return ModelAndView
     */
    public ModelAndView passwordChange(HttpServletRequest request, HttpServletResponse response) {


        logger.info("passwordChange");

        return new ModelAndView("passwordChange");
    }

    /**
     * 변경된 비밀번호를 데이터베이스에 업데이트 한다.
     *
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    public ModelAndView passwordChangeAction(HttpServletRequest request, HttpServletResponse response)  throws Exception {

        Member member = new Member();
        bind(request, member);



        logger.info("passwordChangeAction");
        logger.info("BETTERSOFT_ID     : {}", member.getBETTERSOFT_ID());
        logger.info("PASSWORD          : {}", member.getPASSWORD());

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = df.format(new Date());

        /**
         * 가맹점 수정일자에 오늘 날짜를 담는다.
         */
        member.setMODIFY_DATE(strDate);

        String password = member.getPASSWORD();

        BettersoftPortalCommon common = new BettersoftPortalCommon();

        /**
         * 넘어온 패스워드를 암호화하여 도메인에 담는다.
         */
        member.setPASSWORD(common.getEncodedPassword(password));

        logger.info("ENCODED PASSWORD  : {}", member.getPASSWORD());

        String result;

        /**
         * 패스워드 업데이트를 실행한다.
         */
        result = bettersoftPortalService.updatePasswordByMember(member);

        ModelAndView mav = new ModelAndView();

        mav.addObject("result", result);
        mav.setViewName(request.getParameter("nextTarget"));

        return mav;
    }


    /**
     * 회원가입을 실시한다.
     *
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    public ModelAndView insertMember(HttpServletRequest request, HttpServletResponse response)  throws Exception {
        Member member = new Member();
        bind(request, member);

        logger.info("insertMember");
        logger.info("id         : {}", member.getBETTERSOFT_ID());
        logger.info("password   : {}", member.getPASSWORD());

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = df.format(new Date());

        /**
         * HttpServletRequest 를 MultipartHttpServletRequest 로 casting 한다.
         * casting 된 request 에서 PROFILE_IMAGE 파라미터로 온 파일을 얻는다.
         */
        MultipartHttpServletRequest mpRequest = (MultipartHttpServletRequest) request;

        MultipartFile mpFile = mpRequest.getFile("PROFILE_IMAGE"); // casting 된 request 에서 파일 얻어오기

        /**
         * 첨부파일이 있는지 검사하기 위해 request 로 부터 받은 mpFile 이 empty 인지 검사한다.
         */
        if(mpFile.isEmpty()){
            /**
             * 첨부된 파일이 없다면 PROFILE_IMAGE_URL 을 공란으로 셋팅한다.
             */
            member.setPROFILE_IMAGE_URL("");

        }else{
            /**
             * 첨부된 있다면 파일업로드 시작
             */

            /**
             * String uploadPath = request.getRealPath("/");             *
             * 코드상 Context의 절대경로 가져오기
             * request 가 가지고 있는 ServeltContext 에 있는 것을 중복으로 가지고 있기 때문 J2EE 1.4 부터 Deprecated 되었다.
             * 아래와 같이 사용한다.
             */
            String uploadPath = request.getSession().getServletContext().getRealPath("/");

            logger.info("uploadPath : {}", uploadPath);

            UploadFile file =  bettersoftPortalService.uploadFile(mpFile, uploadPath + "/upload/member/");

            File src = new File(uploadPath + "/upload/member/" + file.getTempFileName()); // 업로드된 이미지 원본 경로

            /**
             * 업로드 되어 있는 원본 소스를 이용하여 PNG 형식의 이미지파일로 재생성할 것 이기 때문에
             * 확장자를 제외한 이름을 만들어준다.
             */
            String tempFileName = file.getTempFileName().substring(0, file.getTempFileName().length()-4);
            logger.info("tempFileName : {}", tempFileName);

            File profileDest = new File(uploadPath + "/upload/profile/" + tempFileName + ".png"); // 만들 썸네일 이미지 경로

            /**
             * 가로 thumbnail_size_x, 세로 thumbnail_size_y 의 고정 비율 이미지를 생성한다.
             * 가로, 세로 중 긴쪽을 기준으로 하여 짧은쪽의 길이를 비율을 재조정한다.
             * 빈공백은 지정해놓은 RGB 색으로 채워진다.
             */
            String profileName = bettersoftPortalService.createPushImage(src, profileDest, profile_size_x, profile_size_y); // 프로파일 이미지 만들기


            /**
             * DB에 기록하기 위해 업로드되어 변환된 IMAGE 파일 이름을 담는다.
             * DB에 기록하기 위해 업로드되어 변환된 THUMBNAIL_IMAGE 파일 이름을 담는다.
             */
            member.setPROFILE_IMAGE_URL(profileName);


            logger.info("IMAGE_FILE_NAME   : {}", file.getTempFileName());
            logger.info("PROFILE_NAME      : {}", profileName);


        }


        /**
         * 사용을 위해 넣어줘야할 초기값들을 셋팅한다.
         * ACTICATE_YN = Y : 활성 비활성 여부
         * MODIFY_DATE = 현재시각 : 정보수정 일자
         * REGISTER_DATE = 현재시각 : 가맹점 등록 일자
         */
        member.setACTIVATE_YN("Y");
        member.setGRADE("4");
        member.setMODIFY_DATE(strDate);
        member.setREGISTER_DATE(strDate);

        /**
         * 모든 값이 셋팅됐으므로 DB에 작성
         */
        String result = bettersoftPortalService.insertMember(member);

        logger.info("insertMerchant Result : {}", result);


        ModelAndView mav = new ModelAndView();
        /**
         * F5 새로고침이나 뒤로가기로 인해 중복 가입 에러가 발생하지 않도록 redirect 로 가맹점 로그인 페이지 merchantIndex 로 보낸다.
         */
        mav.setViewName("redirect:./portalLogin.do");
        return mav;
    }


    /**
     * 로그인을 시도한다. 성공 시 main 페이지로 이동한다.
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView login(HttpServletRequest request, HttpServletResponse response) throws Exception{


        logger.info("login");


        Member member = new Member();
        bind(request, member);

        String id = request.getParameter("id");
        String password = request.getParameter("password");

        logger.info("login");

        String result = bettersoftPortalService.logIn(id, password);

        if(result == "SUCCESS"){ //로그인 서비스 성공


            logger.info("login SUCESS Process");
            Member smember = new Member();
            smember = bettersoftPortalService.getMemberById(id);

            String name = smember.getNAME();
            String email = smember.getEMAIL();
            String grade = smember.getGRADE();

            // 로그인 최종 성공시 세션에 멤버의 정보를 담는다
            HttpSession session = request.getSession();

            session.setAttribute("userId", id);
            session.setAttribute("name", name);
            session.setAttribute("nickName", name);
            session.setAttribute("email", email);
            session.setAttribute("grade", grade);


            ModelAndView mav = new ModelAndView();
            mav.addObject("member", smember);
            mav.setViewName("portalIndex");

            return mav;
        }else{
            return new ModelAndView("index");
        }
    }






    /**
     * 로그인 후 메인 페이지로 접속한다.
     *
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    public ModelAndView main(HttpServletRequest request, HttpServletResponse response) {
        String userId = request.getParameter("userId");
        String userPassword = request.getParameter("userPassword");

        logger.info("userId : {}", userId);
        logger.info("userPassword : {}", userPassword);

//            Member member = new Member();
//            member.setBETTERSOFT_ID(userId);
//            member.setPASSWORD(userPassword);

        String result = bettersoftPortalService.logIn(userId, userPassword);
        logger.info("result : {}", result);

        return new ModelAndView("main");
    }

    /**
     * 회원가입 페이지로 이동한다
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView register(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("register");
    }


    /**
     *  개인 정보 화면으로 이동한다.  버튼을 두어 개인정보 변경 / 비밀번호 변경 가능하다.
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView myInfo(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("myInfo");
    }


    /**
     *  개인 정보 변경 화면으로 이동한다.
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView changeMyInfo(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("changeMyInfo");
    }


    /**
     *  비밀번호 변경 화면으로 이동한다.
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView changeMyPassword(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("changeMyPassword");
    }

    /**
     * 회사소개
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView introduce(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("introduce");
    }

    /**
     * 회사소개 - 조직
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView introduceOrg(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("introduceOrg");
    }

    /**
     * 회사소개 - 연혁
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView introduceHis(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("introduceHis");
    }

    /**
     * 회사소개 - 세부실적
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView introducePer(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("introducePer");
    }

    /**
     * 서비스
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView service(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("service");
    }

    /**
     * 제품
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView product(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("product");
    }

    /**
     * 제품 - 데이브
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView dayve(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("dayve");
    }

    /**
     * 제품 - 캐럿 IOS
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView carrotIOS(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("carrotIOS");
    }

    /**
     * 제품 - 캐럿 안드로이드
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView carrotAndroid(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("carrotAndroid");
    }

    /**
     * 제품 - 레쇼날
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView rational(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("rational");
    }

    /**
     * 제품 - 웹스피어
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView websphere(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("websphere");
    }

    /**
     * 제품 - 디비2
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView db2(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("db2");
    }

    /**
     * 제품 - 로터스
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView lotus(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("lotus");
    }

    /**
     * 제품 - 티볼리
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView tivoli(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("tivoli");
    }

    /**
     * 문의하기
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView contact(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("contact");
    }


    /**
     * 고객센터에서 상호명과 연락처를 carrot@bettersoft.co.kr 로 보내준다.
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView sendEmail(HttpServletRequest request, HttpServletResponse response) {

        /**
         * 연락처 phoneNumber, 상호명 companyName 을 request 로 부터 얻어온다.
         */
        String name = request.getParameter("name");
        String phoneNumber = request.getParameter("phoneNumber");
        String content = request.getParameter("content");


        logger.info("sendEmail");
        logger.info("name        : {}", name);
        logger.info("phoneNumber : {}", phoneNumber);
        logger.info("content     : {}", content);

        /**
         * 메일의 제목
         */
        String subject = "Bettersoft 홈페이지 문의 접수";

        /**
         * 메일의 내용 String 에 HTML 태그형식을 붙여서 내용을 완성한다.
         */
        String mailContent = "<html><body>" + "이름 : " + name + "<br>연락처 : " + phoneNumber + "<br>문의내용 : " + content + "</body></html>";

        /**
         * 받는 사람
         */
        String userId = "Bettersoft";

        /**
         * 보내는 사람의 메일주소
         */
        String fromUser = "bettersoft.webmaster@gmail.com";

        /**
         * 받는 사람의 메일주소
         */
        String toUser = "bang@bettersoft.co.kr";

        /**
         * 메일보내기 서비스 제목, 내용, 보내는 사람, 받는사람, 보내는 사람 이름
         */
        String Result = bettersoftPortalService.sendMail(subject, content, fromUser, toUser, userId);

        logger.info("Result : {}", Result);



        return new ModelAndView("redirect:/contact.do");
    }


    /**
     * 로그아웃 컨트롤러
     * HttpSession 을 반환하고 index 페이지로 복귀
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView logout(HttpServletRequest request, HttpServletResponse response){

        HttpSession session = request.getSession(); // 세션 값 반환
        session.invalidate(); // 세션을 삭제하고 index 페이지로 복귀
        return new ModelAndView("index");
    }

    /**
     * 사원조회
     *
     * @param request
     * @param response
     * @return
     */
    public ModelAndView memberList(HttpServletRequest request, HttpServletResponse response) throws Exception{

        Member member = new Member();
        bind(request, member);

        /**
         * Null 에러 방지용 공백 전환
         */
        if(member.getBETTERSOFT_ID() == null){
            member.setBETTERSOFT_ID("");
        }

        if(member.getNAME() == null){
            member.setNAME("");
        }

        if(member.getEMAIL() == null){
            member.setEMAIL("");
        }


        logger.info("memberList");
        logger.info("BETTERSOFT_ID           : ", member.getBETTERSOFT_ID());
        logger.info("NAME                    : ", member.getNAME());
        logger.info("EMAIL                   : ", member.getEMAIL());

        /**
         * ACTICATE_YN 값이 Y 인 회원들만 가져온다.
         */
        member.setACTIVATE_YN("Y");

        /**
         * Member 리스트 가져오기
         */
        java.util.List memberList = bettersoftPortalService.getMemberListBySearchword(member);
        String totalCount = bettersoftPortalService.getTotalMemberCountBySearchword(member);

        /**
         * 페이징 처리를 위한 부분
         */
        request.setAttribute("param", request);
        request.setAttribute("totalRow", totalCount);
        request.setAttribute("currentPage", (new StringBuilder()).append(member.getCurrentPage()).append("").toString());
        request.setAttribute("pageSize", (new StringBuilder()).append(member.getPageSize()).append("").toString());

        ModelAndView mav = new ModelAndView();
        mav.setViewName("memberList");
        mav.addObject("memberList", memberList);
        mav.addObject("totalCount", totalCount);
        return mav;
    }


    /**
     * memberUpdate 페이지로 이동한다.
     *
     * @param request HttpServletRequest
     * @param response HttpServletReponse
     * @return ModelAndView
     */
    public ModelAndView memberUpdate(HttpServletRequest request, HttpServletResponse response) {

        Member member = new Member();

        /**
         * 세션값 반환 받기
         */
        HttpSession session = request.getSession(false);

        logger.info("memberUpdate");

        member = bettersoftPortalService.getMemberById((String)session.getAttribute("userId"));

        ModelAndView mav = new ModelAndView();

        mav.addObject("member", member);
        mav.setViewName("memberUpdate");


        return mav;
    }


    /**
     * 회원 정보 수정을 수행한다.
     *
     * @param request HttpServletRequest
     * @param response HttpServletReponse
     * @return ModelAndView
     */
    public ModelAndView memberUpdateAction(HttpServletRequest request, HttpServletResponse response) throws Exception{

        Member member = new Member();


        bind(request, member);

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = df.format(new Date());

        // 파일 업로드 시작
        MultipartHttpServletRequest mpRequest = (MultipartHttpServletRequest) request; // HttpServletRequest 를 MultipartHttpServletRequest 로 casting

        MultipartFile mpFile = mpRequest.getFile("PROFILE_IMAGE"); // casting 된 request 에서 파일 얻어오기


        logger.info("merchantUpdateAction");
        logger.info("BETTERSOFT_ID     : {}", member.getBETTERSOFT_ID());
        logger.info("NAME              : {}", member.getNAME());
        logger.info("PROFILE_IMAGE     : {}", mpFile.isEmpty());

        /**
         * 첨부파일이 있는지 검사하기 위해 request 로 부터 받은 mpFile 이 empty 인지 검사한다.
         */
        if(mpFile.isEmpty()){

        }else{
            /**
             * 첨부된 있다면 파일업로드 시작
             */

            /**
             * String uploadPath = request.getRealPath("/");             *
             * 코드상 Context의 절대경로 가져오기
             * request 가 가지고 있는 ServeltContext 에 있는 것을 중복으로 가지고 있기 때문 J2EE 1.4 부터 Deprecated 되었다.
             * 아래와 같이 사용한다.
             */
            String uploadPath = request.getSession().getServletContext().getRealPath("/");

            UploadFile file = bettersoftPortalService.uploadFile(mpFile, uploadPath + "/upload/member/");

            File src = new File(uploadPath + "/upload/member/" + file.getTempFileName()); // 업로드된 이미지 원본 경로

            /**
             * 업로드 되어 있는 원본 소스를 이용하여 PNG 형식의 이미지파일로 재생성할 것 이기 때문에
             * 확장자를 제외한 이름을 만들어준다.
             */
            String tempFileName = file.getTempFileName().substring(0, file.getTempFileName().length()-4);
            logger.info("tempFileName : {}", tempFileName);

            File profileDest = new File(uploadPath + "/upload/profile/" + tempFileName + ".png"); // 만들 썸네일 이미지 경로


            /**
             * 가로 thumbnail_size_x, 세로 thumbnail_size_y 의 고정 비율 이미지를 생성한다.
             * 가로, 세로 중 긴쪽을 기준으로 하여 짧은쪽의 길이를 비율을 재조정한다.
             * 빈공백은 지정해놓은 RGB 색으로 채워진다.
             */
            String profileName = bettersoftPortalService.createPushImage(src, profileDest, profile_size_x, profile_size_y); // 프로파일 이미지 만들기
//          String profileName = checkMileageService.createThumbnail(src, thumbDest, thumbnail_size_x, thumbnail_size_y); // 썸네일 이미지 만들기


            member.setPROFILE_IMAGE_URL(profileName);



            logger.info("IMAGE_FILE_NAME   : {}", file.getTempFileName());
            logger.info("PROFILE_NAME      : {}", profileName);

        }

        /**
         * 현재의 날짜를 수정일자에 담는다.
         */
        member.setMODIFY_DATE(strDate);

        /**
         * 업데이트된 가맹점의 정보를 담는다.
         */
        String result = bettersoftPortalService.updateMemberByBettersoftId(member);


        ModelAndView mav = new ModelAndView();

        mav.setViewName(request.getParameter("nextTarget"));
        mav.addObject("userId", member.getBETTERSOFT_ID());

        mav.addObject("result", result);

        return mav;
    }







///////////////////////////////////////
// Spring Framework Setter Injection //
///////////////////////////////////////

}
